package com.spring.framework.transaction.example;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.support.TransactionTemplate;

/**
 * @author xuweizhi
 * @since 2021/08/03 10:20
 */
@Configuration
public class MysqlConfig {


	/**
	 * 配置Druid数据源
	 */
	@Bean
	public DruidDataSource druidDataSource() {
		DruidDataSource druidDataSource = new DruidDataSource();
		//为了方便，直接硬编码了，我们可以通过@Value引入外部配置，
		//如果使用Spring boot就更简单了，直接使用@ConfigurationProperties引入外部配置
		//简单的配置数据库连接信息，其他连接池信息采用默认配置
		druidDataSource.setUrl("jdbc:mysql://localhost:3306/test");
		druidDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
		druidDataSource.setUsername("root");
		druidDataSource.setPassword("root");
		return druidDataSource;
	}

	/**
	 * 配置JdbcTemplate
	 * 直接使用spring-jdbc来操作某一个数据库，不使用其他外部数据库框架
	 */
	@Bean
	public JdbcTemplate jdbcTemplate() {
		//传入一个数据源
		return new JdbcTemplate(druidDataSource());
	}


	/**
	 * 配置DataSourceTransactionManager
	 * 用于管理某一个数据库的事务
	 */
	@Bean
	public DataSourceTransactionManager transactionManager() {
		//传入一个数据源
		return new DataSourceTransactionManager(druidDataSource());
	}

	/**
	 * 配置TransactionTemplate
	 * 用于方便编程式的事务操作
	 */
	@Bean
	public TransactionTemplate transactionTemplate() {
		//传入一个TransactionManager
		return new TransactionTemplate(transactionManager());
	}
}
